/*
 * TruthTable.h
 *
 *  Created on: Mar 8, 2012
 *      Author: luiz
 */

#ifndef TRUTHTABLE_H_
#define TRUTHTABLE_H_

#include <vector>
#include <string>
#include <map>

class TruthTable
{

    int num_inputs_;
    int num_outputs_;

    std::map<std::string,int> input_name_id;
    std::map<std::string,int> output_name_id;

    std::vector<std::pair<std::string,std::vector<int> > > truth_table_inputs;
    std::vector<std::pair<std::string,std::vector<int> > > truth_table_outputs;

public:

    TruthTable(int num_inputs, int num_outputs);
    TruthTable(const TruthTable & truthtable);
    TruthTable& operator=(const TruthTable & truthtable);

    int num_inputs();
    int num_outputs();
    int num_entrys() const;

    int get_input_entry_value(int input_id, int input_entry);
    void set_input_entry_value(int input_id, int input_entry, int);
    void set_input_entry_name(int input_id, std::string input_name);
    void add_input_entry(int input_id, int entry_value);
    std::string get_input_name_by_id(int input_id);

    std::vector<int> get_list_input_id();
    std::vector<int> get_list_output_id();


    int get_output_entry_value(int output_id, int output_entry);
    void set_output_entry_value(int output_id, int output_entry, int);
    void set_output_entry_name(int output_id, std::string output_name);
    void add_output_entry(int output_id, int entry_value);
    std::string get_output_name_by_id(int output_id);
    int get_output_entry_by_name(std::string name);

    std::string print_truth_table() const;

    int get_output_occurrences_by_value(int value);

    virtual ~TruthTable();
};

#endif /* TRUTHTABLE_H_ */
